Current File : /home/jeconsul/public_html/wp-content/plugins/suremails/src/components/nav-nenu.js |
// src/components/NavMenu.js
import { useState, useEffect, renderToString } from '@wordpress/element';
import { useLocation, Link, useNavigate } from 'react-router-dom';
import { Topbar, HamburgerMenu, Badge, Button } from '@bsf/force-ui';
import { CircleHelp, Megaphone } from 'lucide-react';
import { SureMailIcon } from 'assets/icons';
import { cn } from '@utils/utils';
import useWhatsNewRSS from '../../lib/useWhatsNewRSS';
import { __ } from '@wordpress/i18n';
import { useQuery } from '@tanstack/react-query';
import { fetchSettings } from '@api/settings';
const NavMenu = () => {
const location = useLocation();
const navigate = useNavigate();
const version = window.suremails?.version || '1.0.0';
// Fetch settings data via react-query
const { data: settingsData } = useQuery( {
queryKey: [ 'settings' ],
queryFn: fetchSettings,
select: ( response ) => response.data,
refetchOnWindowFocus: false,
} );
/**
* Check if email simulation is active or not based on the settings data.
* If email_simulation is set to 'yes' then email simulation is active.
*
* @constant {boolean} emailSimulation - Email simulation status. True if active, false otherwise. Default is false.
* @type {boolean}
*/
const emailSimulation = settingsData?.email_simulation === 'yes';
// Define navigation items
const navItems = [
{ name: 'Dashboard', path: '/dashboard' },
{ name: 'Settings', path: '/settings' },
{ name: 'Connections', path: '/connections' },
{ name: 'Email Logs', path: '/logs' },
{ name: 'Notifications', path: '/notifications' },
];
// Get the current active path
const [ activePath, setActivePath ] = useState( location.pathname );
// Update activePath when the location changes
useEffect( () => {
setActivePath( location.pathname );
}, [ location.pathname ] );
const handleIconClick = () => {
navigate( '/dashboard' );
};
useWhatsNewRSS( {
uniqueKey: 'suremails',
rssFeedURL: 'https://suremails.com/whats-new/feed/',
selector: '#suremails_whats_new',
flyout: {
title: __( "What's New?", 'suremails' ),
className: 'suremails-whats-new-flyout',
},
triggerButton: {
icon: renderToString(
<Megaphone
className="size-4 m-1 text-icon-primary"
strokeWidth={ 1.5 }
/>
),
},
} );
return (
<>
<Topbar className="relative shadow-sm bg-background-primary h-16 z-[1] p-0 gap-0">
{ /* Left Section: Logo */ }
<Topbar.Left className="p-5 gap-5">
<HamburgerMenu className="lg:hidden">
<HamburgerMenu.Toggle className="size-6" />
<HamburgerMenu.Options>
{ navItems.map( ( option ) => (
<HamburgerMenu.Option
key={ option.name }
tag={ Link }
to={ option.path }
active={ activePath.trim() === option.path }
>
{ option.name }
</HamburgerMenu.Option>
) ) }
</HamburgerMenu.Options>
</HamburgerMenu>
<Topbar.Item>
<div
onClick={ handleIconClick }
className="flex items-center justify-center cursor-pointer"
>
<SureMailIcon className="h-6 w-6" />
</div>
</Topbar.Item>
</Topbar.Left>
{ /* Middle Section: Navigation */ }
<Topbar.Middle
className="h-full lg:flex hidden"
align="left"
gap="xs"
>
<Topbar.Item className="h-full">
<nav className="h-full space-x-4">
{ navItems.map( ( item ) => (
<Link
key={ item.name }
to={ item.path }
className={ cn(
'inline-block relative h-full content-center px-1 text-sm text-text-secondary font-medium no-underline bg-transparent focus:outline-none shadow-none border-1 hover:text-text-primary transition-colors duration-300',
activePath.trim() === item.path
? 'text-text-primary border-none after:content-[""] after:absolute after:bottom-0 after:inset-x-0 after:h-px after:bg-border-interactive after:transition-all after:duration-300'
: ''
) }
>
{ item.name }
</Link>
) ) }
</nav>
</Topbar.Item>
</Topbar.Middle>
{ /* Right Section: Version Badge and Icons */ }
<Topbar.Right className="p-5">
{ emailSimulation && (
<Topbar.Item className="gap-2">
<Badge
label={ __(
'Email Simulation Active',
'suremails'
) }
size="sm"
type="pill"
variant="yellow"
disableHover={ true }
/>
</Topbar.Item>
) }
<Topbar.Item>
<Badge
label={ `V ${ version }` }
size="xs"
variant="neutral"
/>
</Topbar.Item>
<Topbar.Item className="gap-2">
<Button
variant="ghost"
size="xs"
icon={ <CircleHelp /> }
onClick={ () =>
window.open( suremails?.docsURL, '_blank' )
}
href=""
/>
{ /** What's New Integration */ }
<div
id="suremails_whats_new"
className="[&>a]:p-0.5 [&>a]:pl-0"
></div>
</Topbar.Item>
</Topbar.Right>
</Topbar>
</>
);
};
export default NavMenu;